要運作一套系統,只需要有一台機器,包含各種硬體資源,機器上安裝好作業系統,就可以準備把程式放上去執行了。
像這樣:
特性:
資源和環境由所有運行在機器上的服務共同使用。
系統間容易互相干擾、爭搶資源。
傳統的系統運作方式就像建了一個大廚房讓所有餐廳共用的美食廣場,起初商家進駐時相安無事,但隨著業務增長,不但各自需要的空間增加,需求也更複雜。所有廚師們共用一個廚房... 應該不難想像會發生什麼事:壽司飯沾染咖哩的香料味、烤箱的高溫讓隔壁的義式冰淇淋拿出來就融化,廚師們搶爐子搶冰箱,東奔西跑亂成一團。
將每家餐廳搬到獨立的店面,大家都有自己的廚房不就解決問題了嗎?
(當然,水電這些基礎資源還是共用的)
於是,虛擬化技術出現了。
是一種將資源抽象化的技術,讓一台實體機可以運行多個虛擬環境,而且這些環境每一個都是各自獨立的,擁有自己的作業系統。
虛擬化技術的出現大大提升了資源調度的靈活性。
在 Hypervisor
的運作下:
自從採用虛擬化建置系統,開發人員就不用再為了處理依賴衝突或是配合不同的作業系統不斷開新機器啦!還可以隨時因應業務需要調整配置,不必擔心其他系統受影響,能更有效地使用硬體資源。
不過相對的,為使資源能完全隔離,每台虛擬機器都需要配置自己的作業系統,會消耗更多資源且啟動時間也比較長。
特性:
虛擬機之間完全隔離。
每台虛擬機都有完整的操作系統和虛擬硬體,比起傳統方式會消耗更多資源。
每次都需要啟動完整的操作系統。
雖然清楚區分了每家餐廳,不過原先可以共用的廚具現在得一家一套了。任何商家要進駐或是撤離都不免勞師動眾,就算不重新裝潢也難免需要調整設備。
現在,美食餐廳的商家都改成了餐車,餐車裡包含了營業所需的一切:廚具、原料、客製化的烹飪環境。這些餐車可以在美食廣場內隨意配置位置,不論移動到哪裡都可以迅速開始營業,休息時還能收起來節省空間。一但遇到人潮眾多,還能快速加開新餐車立刻營業!
將應用程式放在容器內,容器中含應用程式運行所需的一切:執行檔、程式碼、程式庫和組態檔等...,使其變得輕量且容易遷移的技術。
容器化由所有容器 (Container) 共享 Host OS
,雖說隔離性沒有虛擬化好(但實務上也夠用),卻也降低了 VM 中 Guest OS
資源無法重複使用的缺點,同時省去啟動服務時執行 Guest OS
的時間。
當然,就像虛擬化需要Hypervisor
,容器化也需要一層中介來調度資源和運行容器。Container Runtime
就是管理和運行容器的軟體層,負責處理容器的生命周期。只要確保 Container Runtime
正常運行,輕量的容器不但易於搬遷, 啟動快速的特性也為容器化技術賦予了高擴展性。
不過,容器通常需要與硬體機器運行相同的操作系統,無法像虛擬化那樣在同一台機器上運行完全不同的作業系統。且由於作業系統的設計和特性,容器化技術幾乎都使用在 Linux 上(註),
特性:
輕量,容易搬遷且啟動速度快。
一致性強,可以確保在不同環境下的行為一致。
需與硬體機器運行相同的作業系統。
虛擬機和容器都是透過虛擬化和封裝使硬體資源能更妥善被利用的方式。
虛擬機封裝了作業系統、所有軟體層和多個應用程式;容器則不包含作業系統。
兩者各有適用場景。
簡單總結兩者特性:
註(1)
Namespaces 和 Cgroups